package com.atguigu.controller;

import com.alibaba.fastjson.JSONObject;
import com.atguigu.constant.RedisConst;
import com.atguigu.entity.UserInfo;
import com.atguigu.jwt.JwtHelper;
import com.atguigu.result.RetVal;
import com.atguigu.service.UserInfoService;
import com.atguigu.util.IpUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserInfoService userService;
    @Autowired
    private RedisTemplate redisTemplate;
    //实现用户的登录
    @PostMapping("/login")
    public RetVal login(@RequestBody UserInfo userInfo, HttpServletRequest request){
        //1.查询数据库中是否有用户的信息
        UserInfo dbUserInfo = userService.getUser(userInfo);
        //2.有 则生成一个token字符串以及用户的昵称信息 并返回给页面
        if (dbUserInfo != null){
            //返回前端的结果
            Map<String, Object> map = new HashMap<>();
            //利用jwt生成token字符串(比较长 这里用uuid)  或者用  uuid也可以生成
//            String token = JwtHelper.createToken(dbUserInfo.getLoginName());
            String token = UUID.randomUUID().toString();
            map.put("token",token);
            map.put("nickName",dbUserInfo.getNickName());
            //将用户信息放入到缓存中
            //定义一个key
            String userKey = RedisConst.USER_LOGIN_KEY_PREFIX+token;
            //userId 判断是否为登录 ip判断是否为同一台电脑登录
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("userId",dbUserInfo.getId().toString());
            jsonObject.put("loginIp", IpUtil.getIpAddress(request));//IP地址从request中获取
            //3.将用户信息放入到缓存中
            redisTemplate.opsForValue().set(userKey,jsonObject.toJSONString(),RedisConst.USERKEY_TIMEOUT, TimeUnit.SECONDS);
            //返回前端结果
            return RetVal.ok(map);
        }
        return RetVal.fail().message("登录失败！");
    }
    //登出
    @GetMapping("/logout")
    public RetVal logout(HttpServletRequest request){
        //从请求头中获取token
        String token = request.getHeader("token");
        String userKey = RedisConst.USER_LOGIN_KEY_PREFIX+token;
        redisTemplate.delete(userKey);
        return RetVal.ok();
    }
}